#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define BUFFER_SIZE 5

int buffer[BUFFER_SIZE];
int count = 0;

// 初始化锁
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 生产者线程
void *producer(void *arg)
{
    int item = 1;
    while (1)
    {
        // 加锁（获取互斥锁 拿不到等，拿到向下执行，其它线程不能进入）
        pthread_mutex_lock(&mutex);

        // 如果缓冲区已满count=5, 应用暂停添加，且一旦count<5之后恢复执行

        
        // 向缓存区添加一个数据
        buffer[count++] = item++;

        printf("生产者向第%d位添加一个数据：%d\n", count-1, buffer[count - 1]);
        
        // 释放锁（其它线程可以进入了）
        pthread_mutex_unlock(&mutex);
    }
}

// 消费者线程
void *consumer(void *arg)
{
    while (1)
    {
        // 加锁
        pthread_mutex_lock(&mutex);
        // 如果缓冲区已空count=0, 应用暂停减少，且一旦count>0之后恢复执行
        --count;
        printf("消费者从第%d位读取出一个数据 %d\n", count, buffer[count]);
        
        // 释放锁
        pthread_mutex_unlock(&mutex);
    }
}

int main()
{
    pthread_t producer_thread, consumer_thread;

    pthread_create(&producer_thread, NULL, producer, NULL);
    pthread_create(&consumer_thread, NULL, consumer, NULL);

    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);
    
    return 0;
}